package com.clear.proxy.staticProxy.cacheProxy;

import java.util.HashMap;

/**
 * 缓存代理类
 */
public class CachingDataQueryProxy implements DataQuery {
    private final HashMap<String, String> cache;
    // 代理类代理谁，就应该持有谁：这里使用组合的方式
    private final DataQuery realDataQuery;

    /**
     * todo 构造代理对象的同时构造被代理对象
     *  以达到对被代理对象的屏蔽
     */
    public CachingDataQueryProxy(DataQuery realDataQuery) {
        // 1.屏蔽被代理对象
        this.realDataQuery = new DatabaseDataQuery();
        this.cache = new HashMap<>();
    }

    /**
     * todo 代理对象中与被代理对象相同的方法需要对被代理对象中方法做增强
     * @param queryKey
     * @return
     */
    @Override
    public String query(String queryKey) {
        String result = cache.get(queryKey);
        // 2.对被代理对象的方法做增强
        // 查询缓存，命中则返回；没有命中则查询数据库，将查询结果存入缓存，再次查询时走缓存
        if (result == null) {
            System.out.println("未命中！");
            result = realDataQuery.query(queryKey);
            cache.put(queryKey,result);
        } else {
            System.out.println("命中！走缓存");
        }
        return result;
    }
}
